package com.cictec.middleware.gps.engine.send.pojo;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cictec.middleware.commons.spring.SpringContextHolder;
import com.cictec.middleware.commons.utils.Constants;
import com.cictec.middleware.commons.utils.PropertiesUtils;

public class BusPositionConvert {

	private static Logger logger = LoggerFactory.getLogger(BusPositionConvert.class);
	
	private static StringRedisTemplate forecastStringRedisTemplate = SpringContextHolder.getBean("stringRedisTemplate");
	
	public static BusPositionMessage explanMsg(Map<String, Object> data) {

//		try {
//			TimingPoint point = MapBeanUtils.map2Java(TimingPoint.class, data);
//			System.out.println(point);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
		
		BusPositionMessage busPosition = new BusPositionMessage();

		busPosition.setMsgType(String.valueOf(data.get(Constants.HED_MSG_TYPE)));
		busPosition.setDevCode(String.valueOf(data.get(Constants.HED_DEV_CODE)));							// 设备ID
		busPosition.setDevUuid(String.valueOf(data.get(Constants.HED_DEV_UUID)));							// 设备UUID
		busPosition.setUploadTime(String.valueOf(data.get(Constants.HED_UPLOAD_TIME)));						// 上传时间
		busPosition.setGatherTime(String.valueOf(data.get(Constants.MSG_INFO_POSITION_GATHER_TIME)));		// 上传时间
		busPosition.setStorageTime(String.valueOf(data.get(Constants.HED_UPLOAD_TIME)));					// 存储时间
		
		busPosition.setLineUuid(String.valueOf(data.get(Constants.LSU_LINE_UUID)));							// 线路uuid
		busPosition.setLineName(String.valueOf(data.get(Constants.MSG_INFO_POSITION_LINE_NAME)));			// 线路名
		busPosition.setLineType(String.valueOf(data.get(Constants.LINE_TYPE)));								// 线路类型（上、下行）
		busPosition.setDirection(String.valueOf(data.get(Constants.LINE_TYPE)));							// 线路类型（上、下行）

		busPosition.setBusUuid(String.valueOf(data.get(Constants.HED_BUS_UUID)));							// 车辆uuid
		busPosition.setBusPlate(String.valueOf(data.get(Constants.HED_BUS_PALTE)));							// 车牌号码
		busPosition.setBuselfcode(String.valueOf(data.get(Constants.HED_BUS_SELF_CODE)));					// 车辆自编号
		busPosition.setPhone(String.valueOf(data.get(Constants.MSG_INFO_CALL_PHONE)));						// 通话号码

		busPosition.setDriverUuid(String.valueOf(data.get(Constants.MSG_INFO_DRIVER_UUID)));
		busPosition.setDriverName(String.valueOf(data.get(Constants.MSG_INFO_DRIVER_NAME)));				// 司机名称
		busPosition.setDriverSignTime(String.valueOf(data.get(Constants.MSG_INFO_DRIVER_SIGN_TIME)));		// 司机签到时间

		busPosition.setLng(String.valueOf(data.get(Constants.MSG_INFO_POSITION_LONGITUDE)));				// 经度
		busPosition.setLat(String.valueOf(data.get(Constants.MSG_INFO_POSITION_LATITUDE)));					// 纬度
		busPosition.setCounrse(String.valueOf(data.get(Constants.MSG_INFO_POSITION_COURSE)));				// 角度
		busPosition.setRate(String.valueOf(data.get(Constants.MSG_INFO_POSITION_RATE)));					// 相对距离(线路)
		busPosition.setRateStation(String.valueOf(data.get(Constants.MSG_INFO_POSITION_STATION_RATE)));   	// 相对距离(站点)
		busPosition.setStationSequence(String.valueOf(data.get(Constants.LINE_STATION_SEQ)));				// 站点序号
//		busPosition.setIsOffset(String.valueOf(data.get(Constants.MSG_INFO_GPS_DRIFT)));					// 是否漂移
		busPosition.setBusSpeed(String.valueOf(data.get(Constants.MSG_INFO_POSITION_SPEED)));				// 时速


		busPosition.setInStation(String.valueOf(data.get(Constants.MSG_INFO_POSITION_ENTER_OUT_SATION)));	// 进出站状态
		busPosition.setNextStation(String.valueOf(data.get(Constants.MSG_INFO_POSITION_STATION)));			// 站点名

		busPosition.setDevOnline(String.valueOf(data.get(Constants.MSG_INFO_LOGIN_STATUS)));				// 在/离线状态
		busPosition.setOperStatus(String.valueOf(data.get(Constants.MSG_INFO_POSITION_IN_OPER_TIME)));		// 是否在运营时间内
		busPosition.setDispatchStatus(String.valueOf(data.get(Constants.MSG_INFO_DISPATCH_STATUS)));		// 是否停运 调度状态 0 - 非停运 ，大于0停运
		busPosition.setStandby(String.valueOf(data.get(Constants.MSG_INFO_POSITION_STANDBY_FLAG)));			// 待发车标志
		

		busPosition.setShift(String.valueOf(data.get(Constants.MSG_INFO_SCHEDULE_SHIFT)));					// 当前班次
		busPosition.setTrip(String.valueOf(data.get(Constants.CURRENT_TRIP)));								// 当前趟次
		busPosition.setPlanTime(String.valueOf(data.get(Constants.CURRENT_TRIP_PLAN_DATE)));				// 当前趟次 - 计划发车时间
		busPosition.setStartTime(String.valueOf(data.get(Constants.CURRENT_TRIP_DATE)));					// 当前趟次 - 实际发车时间
		
		busPosition.setTripDate(String.valueOf(data.get(Constants.NEXT_TRIP_DATE)));						// 下一趟次 - 计划发车时间
		
		
		getForecastData(data, busPosition);
		getWarns(data, busPosition);
		

		busPosition.setAllAlarms(String.valueOf(data.get(Constants.MSG_INFO_POSITION_ALL_ALARMS)));				// 所有的报警
		busPosition.setColsedAlarms(String.valueOf(data.get(Constants.MSG_INFO_POSITION_CLOSED_ALARMS)));		// 所有关闭的报警.
		busPosition.setWillDeparture(String.valueOf(data.get(Constants.MSG_INFO_POSITION_WILL_DEPARTURE)));		// 即将发车标志 0 - 不是即将发车 1 - 即将发车
		busPosition.setAheadDeparture(String.valueOf(data.get(Constants.MSG_INFO_POSITION_AHEAD_DEPARTURE)));	// 提前发车报警
		busPosition.setDelayDeparture(String.valueOf(data.get(Constants.MSG_INFO_POSITION_DELAY_DEPARTURE)));	// 延迟发车报警
		busPosition.setFrontTooClose(String.valueOf(data.get(Constants.MSG_INFO_POSITION_FRONT_TOO_CLOSE)));	// 前面车距过近
		busPosition.setFrontTooFar(String.valueOf(data.get(Constants.MSG_INFO_POSITION_FRONT_TOO_FAR)));		// 前面车距过远
		busPosition.setBackTooClose(String.valueOf(data.get(Constants.MSG_INFO_POSITION_BACK_TOO_CLOSE)));		// 后面车距过近
		busPosition.setFrontTooFar(String.valueOf(data.get(Constants.MSG_INFO_POSITION_BACK_TOO_FAR)));			// 后面车距过远
		busPosition.setPositionOvertake(String.valueOf(data.get(Constants.MSG_INFO_POSITION_OVERTAKE)));		// 超车标识
		
		/*****************2017-04-18 杨飞 添加满载率在直线图显示***********************/
		busPosition.setFullLoadRate(String.valueOf(data.get(Constants.MSG_INFO_PASSENGERFLOW_FULLLOADRATE)));
		
		/*****************2017-04-18 杨飞 添加满载率在直线图显示***********************/

		return busPosition;
	}
	
	/**
	 * 获取预测信息
	 * @param data
	 * @param busPosition
	 */
	private static void getForecastData(Map<String, Object> data, BusPositionMessage busPosition){
		String deviatStatus =String.valueOf(data.get(Constants.MSG_INFO_POSITION_PX)); // 偏线状态
		String inOper =String.valueOf(data.get(Constants.MSG_INFO_POSITION_IN_OPER_TIME)); // 运营状态
		if(inOper.equals(Constants.VAL_IN_OPER_TIME_1) && deviatStatus.equals(Constants.VAL_IS_PX_0)){
			// 预测数据从redis中取
			try {
				
				String busFrecast = PropertiesUtils.getString("forecast.key.busForecast");
				if(forecastStringRedisTemplate.hasKey(busFrecast)){
					
					String forecastJson = (String) forecastStringRedisTemplate.opsForHash().get(busFrecast, busPosition.getBusPlate());
					if(null != forecastJson){
						JSONObject busForecast = JSON.parseObject(forecastJson);
						JSONArray busStationForecastList = busForecast.getJSONArray("stationModels");
						
						if(null != busStationForecastList && busStationForecastList.size() > 0){
							
							JSONObject lastStationForecast = (JSONObject) busStationForecastList.get(busStationForecastList.size() -1);
							
							busPosition.setForecastTime(lastStationForecast.getString("time"));				// 预测到达时间
							busPosition.setLastStationNum(busStationForecastList.size() -1 + "");			// 距离终点站数
						}
					}
				}else{
					logger.debug("redis没有预测数据，未找到 key-->"+busFrecast);
				}
			} catch (Exception e) {
				logger.error("获取预测数据报错：" + e);
//				e.printStackTrace();
			}
		}else{
			
		}
			
	}

	
	@SuppressWarnings("unchecked")
	private static void getWarns(Map<String, Object> data, BusPositionMessage busPosition){
		Map<String, Object> warns = (Map<String, Object>) data.get("warns");
		
		Map<String, Object> warnData = new HashMap<String, Object>();
		for (String warnKey : warns.keySet()) {
			JSONObject jsonObject = (JSONObject) warns.get(warnKey);
			Map<String, Object> warn = new HashMap<String, Object>();
			warn.put("warnType", jsonObject.getString("warnType"));
			warn.put("warnStartTime", jsonObject.getString("warnStartTime"));
//			System.out.println(jsonObject);
//			System.out.println(busPosition.getUploadTime() + "\t " + warn);
			warnData.put(jsonObject.getString("warnType"), warn);
			
//			busPosition.setWarn(jsonObject.getString("warnType"), warn);
		}
	
		
		busPosition.setWarns(warnData);
	}
	
}
